import Request from '@/luch-request'
import store from '@/store/index.js';
import {
	BaseUrl
} from '../utils/domain.js'

let isRefreshing = false;
let isLoggingOut = false;
let requests = [];

const request = new Request({
	baseURL: BaseUrl,
	timeout: 60000,
});

// 添加重试队列函数
function retryQueuedRequests(newToken) {
	requests.forEach(callback => callback(newToken));
	requests = [];
}

// 统一的token过期处理函数
function handleTokenExpired(config) {
	if (isLoggingOut) {
		return Promise.reject('Logging out');
	}

	const pages = getCurrentPages();
	const currentPage = pages[pages.length - 1];
	if (currentPage && currentPage.route === 'pages/login/index') {
		return Promise.reject('Already on login page');
	}

	// if (!isRefreshing) {
	// 	isRefreshing = true;
	// 	uni.showModal({
	// 		title: '提示',
	// 		content: '登录已过期，请重新登录',
	// 		showCancel: false,
	// 		confirmText: '重新登录',
	// 		success: (res) => {
	// 			if (res.confirm) {
	// 				store.commit('clearLoginInfo');
	// 				uni.reLaunch({
	// 					url: '/pages/login/index',
	// 					complete: () => {
	// 						isRefreshing = false;
	// 					}
	// 				});
	// 			}
	// 		},
	// 		fail: () => {
	// 			isRefreshing = false;
	// 		}
	// 	});
	// }
	return Promise.reject('Token expired');
}

// 请求拦截器
request.interceptors.request.use((config) => {
	// 退出登录请求特殊处理
	if (isLoggingOut && config.url.includes('/auth/app/wx/logout')) {
		config.header = {
			...config.header,
			'channel': 'CHANNEL_MOBILE',
			'Authorization': uni.getStorageSync('access_token') || ''
		};
		return config;
	}

	const token = uni.getStorageSync('access_token');
	const expireTime = uni.getStorageSync('token_expire_time');

	if (token && expireTime && expireTime < Date.now() && !isLoggingOut) {
		return handleTokenExpired(config);
	}

	config.header = {
		...config.header,
		'channel': 'CHANNEL_MOBILE',
		'Authorization': token
	};
	uni.showNavigationBarLoading();
	return config;
}, (error) => {
	uni.hideNavigationBarLoading();
	return Promise.reject(error);
});

// 响应拦截器
request.interceptors.response.use((response) => {
	uni.hideNavigationBarLoading();

	// 更新token
	if (response.header && response.header.Authorization) {
		store.commit('setAccessToken', response.header.Authorization);
	}

	// 特殊处理退出登录响应
	if (response.config.url.includes('/auth/app/wx/logout') && isLoggingOut) {
		return response.data; // 直接返回数据，不进行通用处理
	}

	if (response.statusCode === 200) {
		if (response.data.code === 200) {
			return response.data;
		} else {
			// 非退出状态下的401处理
			if (response.data.code === 401 && !isLoggingOut) {
				store.commit('clearLoginInfo');
				uni.showToast({
					title: '请您登录后进行查看！！',
					icon: 'none'
				});
				return handleTokenExpired(response.config);
			}

			uni.showToast({
				icon: 'none',
				title: response.data.msg || '请求失败',
			});
			return Promise.reject(response.data);
		}
	} else {
		store.commit('clearLoginInfo');
		uni.showToast({
			icon: 'none',
			title: response.data.msg || '请求失败'
		});
		return Promise.reject(response.data);
	}
}, (error) => {
	uni.hideNavigationBarLoading();

	// 退出过程中的错误特殊处理
	if (isLoggingOut) {
		if (error.statusCode === 401) {
			// 退出时401可能是正常的（token已失效）
			store.commit('clearLoginInfo');
			return {
				code: 200
			}; // 模拟成功响应
		}
		return Promise.reject(error); // 让外部catch处理
	}

	if (error.statusCode === 401 && !isLoggingOut) {
		return handleTokenExpired(error.config);
	} else if (error.statusCode === 403) {
		uni.showToast({
			icon: 'none',
			title: '权限不足'
		});
	} else {
		uni.showToast({
			icon: 'none',
			title: error.data?.msg || '请求失败'
		});
	}

	return Promise.reject(error);
});

// 暴露设置方法
export function setLoggingOut(status) {
	isLoggingOut = status;
}

export default request;